package designpatterns.proxy.dynamicproxy;

import java.lang.reflect.Proxy;

/**
 * 代理工厂
 */
public class TableProxyFactory {
    // 目标对象
    private Object target;

    public TableProxyFactory(Object target) {
        this.target = target;
    }

    public Object getProxyInstance() {
        /*
         * JDK动态代理方法
         * ClassLoader loader :类加载器
         * Class<?>[] interfaces:接口的泛型
         *  InvocationHandler h: 增强方法（代理类的方法）
         */
        return Proxy.newProxyInstance(
                target.getClass().getClassLoader(),
                target.getClass().getInterfaces(),
                (proxy, method, args) -> {
                    Object result = null;
                    try {
                        System.out.println("开启事务:");
                        // 调用目标对象的方法
                        result = method.invoke(target, args);
                        System.out.println("|____提交事务。。。");
                    } catch (Exception e) {
                        e.printStackTrace();
                        System.out.println("|____回滚事务。。。");
                    } finally {
                        System.out.println("|____关闭事务。");
                    }
                    return result;
                }
        );
    }


}
